package licode.unisop.provider.api;

import licode.unisop.provider.info.*;
import licode.unisop.provider.vo.*;

import java.util.List;

/**
 * 定义领域用户相关接口
 *
 * @author licode
 */
public interface SiUserProvider {
    /**
     * 保存或更新用户信息
     * @param user 用户信息
     */
    void addUser(SiUser user);
    void updateUser(SiUser user);

    void batchAddUser(UserBatchInfo batchInfo);

    /**
     * 根据领域和用户查找用户的账号信息
     * @param idFind 查找条件
     * @return 用户账号信息
     */
    SiAccountSet findAccount(UserIdInfo idFind);

    /**
     * 保存用户的账号信息
     * @param info 账号信息
     */
    void saveAccountSet(SiAccountSet info);
    void saveAccount(SiAccountIn info);

    /**
     * 根据领域和用户查找用户的授权信息
     * @param idFind 查找条件
     * @return 用户授权信息
     */
    SiIdentitySet findIdentity(UserIdInfo idFind);

    /**
     * 保存用户的认证信息
     * @param info 认证信息
     */
    void saveIdentitySet(SiIdentitySet info);
    void saveIdentity(SiIdentityIn info);

    /**
     * 领域用户数据提供者名称（唯一）
     * @return 名称
     */
    String getName();

    /**
     * 获取当前注册的用户数
     * @return 用户数
     */
    long getUserCount(SiRealmId realmId);

    /**
     * 根据账号信息查找用户ID
     * @param account 账号信息
     * @return 用户信息
     */
    String findUserId(SiAccount account);

    /**
     * 根据领域和用户ID获取用户信息
     * @param idFind 领域和用户ID
     * @return 用户信息
     */
    SiUser findUserById(UserIdInfo idFind);
    SiUserGroup lookupUserGroup(UserGroupLookupIn req);

    /**
     * 根据账号信息找到用户
     * @param account 账号信息
     * @return 用户信息
     */
    SiUser findUserByAccount(SiAccount account);

    /**
     * 根据用户ID集合查询用户列表
     * @param userIn 查询条件
     * @return 用户列表信息
     */
    List<SiUser> queryUsers(SiQueryUserIn userIn);

    /**
     * 分页查找用户信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiUser> findPage(UserPageInfo req);

    /**
     * 更新用户登录时间
     * @param loginTimeIn 登录时间
     */
    void updateLoginTime(SiUserLoginTimeIn loginTimeIn);

    /**
     * 保存或更新用户分组信息
     * @param group 分组信息
     */
    void saveUserGroup(UserGroupSaveIn group);

    /**
     * 把指定分组分配给用户
     * @param req 请求信息
     */
    void assignGroupToUsers(SiGroupAssignToUsersIn req);

    /**
     * 找到分配给平台的用户分组信息
     * @param req 请求信息
     * @return 用户分组信息
     */
    List<SiUserGroup> findAssignGroup(UserGroupQueryIn req);

    /**
     * 分页查找用户分组信息
     * @param req 查询信息
     * @return 用户分组信息
     */
    SiPageResult<SiUserGroup> findUserGroupPage(UserGroupQueryPageIn req);

    SiPageResult<SiRealmPlatform> findRealPlatform(SiRealmAssignPlatPageIn req);
    List<SiRealmPlatform> findRealPlatformOther(SiRealmPlatformOtherIn req);

    /**
     * 获取已经分配给平台的领域ID
     * @return 领域ID
     */
    String getRealmAssignToPlatform(String platformId);

    void clearGroupsOfPlatform(SiRealmGroupsOfPlatClearIn req);
    void saveGroupsOfPlatform(SiUserGroupsAssignToPlatIn req);

    /**
     * 把领域用户分组分配给平台
     */
    void assignGroupsToPlatform(SiUserGroupsAssignToPlatIn req);
    void assignPlatsToUserGroup(SiPlatsAssignToUserGroupIn req);

    /**
     * 把领域用户分组从平台移除
     */
    long removeGroupFromPlatform(UserGroupRemoveFromPlatIn req);

    /**
     * 把领域用户从分组移除
     */
    void removeUsersFromGroup(UsersRemoveFromGroupIn req);
}
